﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using main.sdk.display.object2d;
using main.sdk.utils;
using Microsoft.Xna.Framework;

namespace main.sdk.utils.animations2D
{
    /**
     * Cria uma sequencia de animações em série
     * 
     * @usage
     *   // Animações de 1 a 3 rodarão na ordem.
     *   Animation2D anim = new SerialAnimation2D();
     *   anim.add(animacao1);
     *   anim.add(animacao2);
     *   anim.add(animacao3);
     */
    public class SerialAnimation2D : Animation2D
    {
        #region Variables

        private List<Animation2D> m_AnimationList = new List<Animation2D>();
        private Animation2D m_CurrentAnimation = null;
        private Object2D m_Object = null; 

        #endregion

        #region Methods

        /**
         * Adiciona uma nova animação.
         * 
         * @param anim - Animação para adicionar
         */
        public void Add(Animation2D anim)
        {
            m_AnimationList.Add(anim);
        } 

        #endregion

        #region Overriden Methods

        /**
         * Verifica se a animação está ativa.
         */
        protected override bool IsActive()
        {
            return (m_AnimationList.Count > 0);
        }

        /**
         * Inicializa a animação
         * 
         * @param obj - O Objeto da animação.
         */
        public override void Setup(Object2D obj)
        {
            m_Object = obj;
        }

        /**
         * Atualiza a animação.
         * 
         * @param Time - Tempo que passou.
         */
        public override void Update(double Time)
        {
            while (true)
            {
                if (m_Object == null)
                    return;
                if (m_AnimationList.Count <= 0)
                    return;
                if (m_CurrentAnimation != m_AnimationList[0])
                {
                    m_CurrentAnimation = m_AnimationList[0];
                    m_CurrentAnimation.Setup(m_Object);
                }
                else
                {
                    m_AnimationList[0].Update(Time);
                }
                if (!m_AnimationList[0].Active())
                {
                    bool Next = m_AnimationList[0].IsSkip();
                    m_AnimationList.RemoveAt(0);
                    if (Next)
                        continue;
                }
                break;
            }
        }

        #endregion
    }
}
